23.1 float.h
:浮点型的特性
说明:提供了用来定义浮点型的范围和精度的宏(没有类型和函数的定义)。
应用:由于只有进行数值分析的专家才会对上述float.h
中定义的宏感兴趣,这可能是标砖哭中最不常用的宏。
23.1.1 对浮点数通用的宏
FLT_ROUND宏
说明:浮点加法的舍入模式,存在5中可能
FLT_RADIX宏
说明:指定了基数的形式,最小值是2(二进制)
23.1.2 其它宏
说明:其他宏用来描述特定类型的特性。
宏命名:根据宏是针对的浮点类型有不同的前缀
宏前缀 | 针对的浮点类型 |
---|---|
FLT | float |
DBL | double |
LDBL | long double |
与有效数字个数相关的宏
与指数相关的宏
其它宏
说明:描述了最大值、最接近0的值(最小正数),两个数之间的最小差值。
23.2 limit.h
:整值类型的大小
说明:提供了用于定义每种整型和字符型取值范围的宏(没有类型或函数)。
23.2.1 用于字符型的宏
说明:char、signed char、unsigned char
注意:char类型在有些机器上默认为unsigned char,有些默认为signed char。CHAR_MIN和CHAR_MAX的值因不同情况有所不同。
①
字符类型 | CHAR_MIN |
---|---|
signed char | SCHAR_MIN |
unsigned char | 0 |
②
字符类型 | CHAR_MAX |
---|---|
signed char | SCHAR_MAX |
unsigned char | UCHAR_MAX |
23.2.2 用于整型的宏
说明:[{signed|unsigned}] [{short|long}] int
用途:在查看编译器是否支持特定大小的整数时十分方便
1 | // 使用预处理指令判断int型是否可以用来存储100 000 |
1 | // 选择正确的类型定义 |
23.3 math.h
:数学计算
说明:包含5中类型
- 三角函数
- 双曲函数
- 指数和对数函数
- 幂函数
- 就近取整函数绝对值函数和取余函数
23.3.1 错误
相关库:errno.h
特点:math.h
中,大多数函数会将一个错误代码存储到一个名字为errno
(math.h
)的特定变量中(这一点不同于其他库)。
相关宏:HUGE_VAL
(math.h
, IEEE标准)
说明:在
math.h
中定义,double类型,不一定是一个普通的数,代表无穷大(7.2)。
用途:当函数的返回值大于double类型的最大值时,会返回HUGE_VAL
。
更多错误:附录D
参数超出定义域
描述:函数的是惨超出了函数的定义域。
会被存储到errno
中的宏:EDOM
(定义域错误)
返回值:NAN
(math.h
, IEEE标准)
返回值超出取值范围
描述:函数的返回值超出了double类型的取值范围。
会被存储到errno
中的宏:ERANGE
(取值范围错误),绝对值过小(下溢出)的情况又可能不存储ERANGE
返回值:分两种情况
- 绝对值过大:根据返回值的正负返回正或负的
HIGE_VAL
- 绝对值过小:返回0
23.3.2 三角函数
cos函数
说明:余弦
原型:math.h
1 | /** |
sin函数
说明:正弦
原型:math.h
1 | /** |
tan函数
说明:正切
原型:math.h
1 | /** |
acos函数
说明:反余弦
原型:math.h
1 | /** |
asin函数
说明:反正弦
原型:math.h
1 | /** |
atan函数
说明:反正切
原型:math.h
1 | /** |
atan2函数
说明:反正切,atan(x)<==>atan2(x, 1.0)
原型:math.h
1 | /** |
1 | cos(PI/4);// 0.707107 |
23.3.4 双曲函数
cosh函数
说明:计算双曲余弦
原型:math.h
1 | /** |
sinh函数
说明:计算双曲正弦
原型:math.h
1 | /** |
tanh函数
说明:计算双曲正切
原型:math.h
1 | /** |
1 | cosh(0.5);// 1.12763 |
22.3.4 指数函数和对数函数
exp函数
说明:返回e的幂
原型:math.h
1 | /** |
1 | // e的3次幂 |
log函数
说明:以e为底的对数(exp函数的逆运算)
原型:math.h``
1 | /** |
1 | log(20.0855);// 3.0 |
log10函数
说明:计算常用对数(以10为底的对数)
原型:math.h
1 | /** |
1 | log10(1000);// 3.0 |
1 | /** |
frexp函数
说明:将浮点数拆成小数部分f和指数部分n,使得原始值等于f x 2^n
。
用途:主要供math.h
中的其他函数点用,很少在程序中直接使用
原型:math.h
1 | /** |
1 | frexp(12.0, &exp);// .75, exp: 4 |
ldexp函数
说明:将小数部分f和整数部分exp组合为,一般而言为f x 2^exp
(frexp函数的逆函数)
原型:math.h
1 | /** |
1 | ldexp(.75, 4);// 12.0 |
modf函数
说明:将一个浮点数的整数部分和小数部分拆解开,返回小数部分,并将整数部分存入第二个参数所指向的变量中
用途:主要供math.h
中的其他函数点用,很少在程序中直接使用
原型:math.h
1 | /** |
23.3.5 幂函数
pow函数
说明:计算x的y次幂
原型:math.h
1 | /** |
1 | pow(3.0, 2.0);// 9.0 |
sqrt函数
说明:计算平方根(算数平方根),sqrt(x)
相当于pow(x, 0.5)
原型:math.h
1 | /** |
1 | sqrt(3.0);// 1.73205 |
23.3.6 就近取整函数、绝对值函数和取余函数
ceil函数
说明:向上舍入(计算大于或等于其参数的最小整数)
原型:math.h
1 | /** |
floor函数
说明:向下舍入(计算小于或等于其参数的最大整数)
原型:math.h
1 | /** |
1 | // 向上取整 |
fabs函数
说明:计算参数的绝对值
原型:math.h
1 | /** |
1 | fabs(7.1);// 7.1 |
fmod函数
说明:取余(第一个参数除以第二个参数所得的余数)
注意:%
只能用于整数,不能用于浮点数
原型:math.h
1 | /* |
1 | fmod(5.5, 2.2);// 1.1 |
23.4 ctype.h
:字符处理
说明:ctype.h
提供了两类函数
一、 字符测试函数
举例isdigit函数
:用来检测一个字符是否是数字
二、 字符大小写转换函数
举例toupper函数
:用来将一个小写字母转换成大写字母
技巧:建议使用ctype.h
中提供的函数而不是用其他手段测试字符或进行大小写转换
- 性能更好(大多数是用宏实现的)
- 可移植性更好(可以在任何字符集上运行)
- 国际化(可以正确运行在世界上不同地点)
特点(参数和返回值类型)ctype.h
中的函数都以int
类型作为参数,并返回一个int
类型的值(C语言可以自动将char
类型的参数转换为int
类型,或将int
类型的返回值转换成char
类型)。
23.4.1 字符测试函数
说明:这些函数具有一样的参数类型
和返回值类型
。
原型:ctype.h
1 | /** |
字符测试函数列表
字符测试函数 | 测试类型 | 备注 |
---|---|---|
isalnum |
字母或数字 | |
isalpha |
字母 | |
iscntrl |
控制字符 | 包括\0x00~\0x1f 、\0x7f |
isdigit |
十进制数字 | |
isgraph |
可显示字符(除空格外) | |
islower |
小写字母 | |
isprint |
可显示字符(包括空格) | |
ispunct |
标点符号 | 空格、字母、数字以外的可显示字符 |
isspace |
空白字符 | 空格、换页符(\f )、换行符(\n )、回车符(\r )、横向制表符(\t )、纵向制表符(\v ) |
isupper |
大写字母 | |
isxdigit |
十六进制数字 |
23.4.2 程序:测试字符测试函数
1 |
|
23.4.3 字符大小写转换函数
tolower函数
说明:返回与作为参数的字母相对应的小写字母
原型:math.h
1 | /** |
toupper函数
说明:返回与作为参数的字母相对应的大写字母
原型:math.h
1 | /** |
23.4.4 程序:测试大小写转换函数
1 |
|
23.5 string.h
:字符串处理
相关章节:13.5
函数分类:可以分为5类
分类 | 说明 |
---|---|
复制函数 | 将字符从内存中的一处复制到另一处 |
拼接函数 | 向字符串末尾追加字符 |
比较函数 | 比较字符数组的函数 |
搜索函数 | 在字符数组中搜索特定字符、字符组或字符串 |
其他函数 | 初始化字符数组或计算字符串的长度 |
23.5.1 复制函数
说明:共4个函数,用于将字符(字节)将内存的一处(源)移动到另一处(目的)。要求第一个参数指向目的,第二个参数指向源,并返回第一个参数(即指向目的的指针)。
memcpy函数
说明:从源向目的复制n个字节(当源和目的重叠时无法正常工作)
对源的要求:不要求字符串以空字符结尾,对任意内存块正常工作。
限制:当从一块内存区域复制到另一块可能重叠的内存区域时,不能保证正常工作。
性能:比memmove函数
快一些
原型:string.h
1 | /** |
1 | char source[] = {'h', '0', 't', '\0', 't', 'e', 'a'}; |
memmove函数
说明:从源向目的复制n个字节(当源和目的重叠时仍然可以正常工作)
对源的要求:不要求字符串以空字符结尾,对任意内存块正常工作。
性能:比memcpy函数
性能差一些
原型:string.h
1 | /** |
1 | char source[] = {'h', '0', 't', '\0', 't', 'e', 'a'}; |
strcpy函数
说明:将一个以空字符结尾的字符串从源复制到目的,会持续复制字符,直到遇到一个空字符为止。
对源的要求:要求字符串以空字符结尾。
原型:string.h
1 | /** |
1 | char source[] = {'h', '0', 't', '\0', 't', 'e', 'a'}; |
strncpy函数
说明:将一个以空字符结尾的字符串从源复制到目的,strcpy函数
的增强版
对源的要求:不要求字符串以空字符串结尾,对任意内存块正常工作。
安全:比strcpy函数
更安全
性能:比strcpy
差一些
原型:string.h
1 | /** |
1 | char source[] = {'h', '0', 't', '\0', 't', 'e', 'a'}; |
23.5.2 拼接函数
strcat函数
说明:将第一个参数追加到第一个参数的末尾
- 参数:要求两个参数都是以
\0
结尾的字符串 - 返回值:返回的字符串会自动在末尾添加
\0
。
原型:string.h
1 | /** |
1 | char str[7] = "tea"; |
strncat函数
说明:strcat
的增强版,第3个参数会限制复制的字符的个数。
原型:string.h
1 | /** |
1 | char str[7] = "tea"; |
23.5.3 比较函数
注意:下面5个函数可以分为两类
分组 | 比较依据 | 性能 |
---|---|---|
memcmp函数 、strcmp函数 、strncmp函数 |
计算机自身的排序顺序(通常是ACILL) | 好 |
strcoll函数 、strxfrm函数 |
依赖当前的本地化设置 | 差 |
memcpm函数
说明:比较两个字符串的大小(具有限制参与比较的字符个数的参数)
原型:string.h
1 | /** |
1 | char s1[] == {'b', 'i', 'g', '\0', 'c', 'a', 'r'}; |
strcpm函数
说明:比较两个字符串(不能设置参与比较的字符数上限),在其中一个字符数组遇到\0
时停止比较。
- 参数:必须是以
\0
结尾的字符串
原型:string.h
1 | /** |
strncmp函数
说明:结合memcmp
和strcmp
,当比较的字符数达到字符数上限或任意一个字符数组中遇到\0
时停止比较。
原型:string.h
1 | /** |
1 | if (strncmp(s1, s2, 3) == 0) ...// true |
strcoll函数
说明:类似strcmp
,不同点在于比较结果依赖本地化设置(通过调用setlocale函数
25.1.2)。
缺点:性能差。
应用:适用于那些根据程序运行的地点不同而可能按不同方式比较的程序。
原型:string.h
1 | /** |
strxfrm函数
说明:按照本地化设置转换字符串。
技巧:需要考虑本地化时可以配合strcmp
来取代strcoll
。因为对两个转化后的参数调用strcmp
等价直接调用strcoll
。
原型:string.h
1 | /** |
1 | size_t len; |
23.5.4 搜索函数
strchr函数
说明:在字符串中搜索指定字符。
停止搜索时机:遇到首个\0
原型:string.h
1 | /** |
1 | char *p, str[] = "Form follows function."; |
memchr函数
说明:类似strchr
,在字符串中搜索指定字符
停止搜索时机:搜索了指定数量的字符后
用途:适用于不希望对整个字符串进行搜索或搜索的内存块不是以\0
结尾时
原型:string.h
1 | /** |
strrhrc函数
说明:函数会首先找到字符串末尾的空字符,然后反向查找字符。
原型:string.h
1 | /** |
1 | char *p, str[22] = "Form follows function"; |
strpbrk函数
说明:返回指向第一个实际参数中与第二个实参中任意一个字符匹配的最左边一个字符的指针。
更通用:strchr
相当于strpbrk
的第二个参数字符串中只给一个字符的情况。
原型:string.h
1 | /** |
1 | char *p, str[] = "Form follows function."; |
strspn函数
说明:返回字符串中第一个不属于给定字符集中的字符的下标。
原型:string.h
1 | /** |
strcspn函数
说明:返回字符串中第一个属于给定字符集中的字符的下标。
原型:string.h
1 | /** |
1 | size_t len; |
strstr函数
说明:在第一个参数(字符串)中搜索能匹配第二个参数(字符串)的子串,并返回找到的第一处匹配子串的指针。
原型:string.h
1 | /** |
1 | char *p, str[] = "Form follows function."; |
strtok函数
说明:分割出一段子字符串。
原理:在s1中搜索,按照s2指定的分隔符找出一系列非空字符(不包含s2中指定的字符)。strtok函数
会写入一个\0
来标记字符序列的末尾,并返回指向这个序列的首字符的指针。
原型:string.h
1 | /** |
(1) 原始字符串状态
1 | char *p, str[] = " Apri1 28,1990"; |
|
A | p | r | i | 1 | |
|
2 | 8 | , | 1 | 9 | 9 | 8 | \0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(2) 月
1 | // 分割出第一个序列,使用" \t"中的字符作为分隔符 |
|
A |
p |
r |
i |
1 |
\0 |
|
2 | 8 | , | 1 | 9 | 9 | 8 | \0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(3) 日
1 | // 从上次结束的位置继续查找 |
|
A | p | r | i | 1 | \0 | |
2 |
8 |
\0 |
1 | 9 | 9 | 8 | \0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(4) 年
1 | // 从上次结束的位置继续查找 |
|
A | p | r | i | 1 | \0 | |
2 | 8 | \0 | 1 |
9 |
9 |
8 |
\0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
23.5.5 其他函数
memset函数
说明:将一个字符的多个副本存储到指定区域。
应用:将数组元素全部初始化为0
原型:string.h
1 | /** |
1 | // 为p指向的内存的N哥字节存储空格 |
strlen函数
说明:返回字符串的长度,不计算字符串末尾的\0
原型:string.h
1 | /** |
strerror函数
说明:24.2
原型:errno.h